﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>  // 用于隐藏密码输入
#include <windows.h> // 用于清屏和睡眠
#include "function.h"

//设计增删改的操作，要保存至CSV
//对于设计不同权限的函数，增加一个role变量，根据类型来编写内部函数内容


// 读取隐藏密码 (Windows 版)
void getPassword(char* password) {
    int i = 0;
    char ch;
    while ((ch = _getch()) != '\r') { // 读取字符，遇到回车 '\r' 结束
        if (ch == '\b' && i > 0) { // 处理退格
            printf("\b \b");
            i--;
        }
        else {
            password[i++] = ch;
            printf("*");
        }
    }
    password[i] = '\0';
    printf("\n");
}

// 清屏函数
void clearScreen() {
    system("cls");
}

// 加载动画
void loadingAnimation() {
    printf("验证中");
    for (int i = 0; i < 3; i++) {
        printf(".");
        Sleep(200);
    }
    printf("\n");
}


//  登录函数 登入成功返回1，失败返回0       登入的时候会保存登入信息至currentUser中
int login(const ListUser* L, User* currentUser, int role) {
    char username[20], password[20];
    int attempts = 0;

    while (attempts < MAX_ATTEMPTS) {
        clearScreen();
        printf("====================================================\n");
        printf("                   登录系统\n");
        printf("====================================================\n");
        printf("  用户名:  ");
        scanf("%s", username);
        printf("  密  码:  ");
        getPassword(password);
        printf("====================================================\n");

        loadingAnimation(); // 模拟加载动画

        // 遍历 ListUser，匹配 (role + username + password)
        int found = 0;
        for (int i = 0; i < L->Length; i++) {
            if (L->Data[i].role == role &&
                strcmp(L->Data[i].UserName, username) == 0 &&
                strcmp(L->Data[i].Password, password) == 0)
            {
                // 登录成功，复制信息到 currentUser         
                *currentUser = L->Data[i];
                found = 1;
                break;
            }
        }

        if (found) {
            printf("登录成功！\n");
            Sleep(1000);
            return 1;
        }
        else {
            printf("用户名或密码错误！剩余尝试次数: %d\n", MAX_ATTEMPTS - attempts - 1);
            Sleep(1500);
            attempts++;
        }
    }

    printf("尝试次数过多，账户已锁定！\n");
    Sleep(1500);
    return 0;
}

//运动员端
void MenuAthlete(ListAth* LA,ListUser* LU,User* currentUser)
{
    const int role = Ath;
    int choice = 0;
    while (1)
    {
        clearScreen();
        printf("============================================\n");
        printf(" 亲爱的敬爱的可爱的美丽的帅气的奶龙%s，您好！\n",LA->Data[GetOneRecorByID(LA,currentUser->Id)].Name);
        printf("============================================\n");
        printf("\n");
        printf("             1. 查询个人信息\n");
        printf("             2. 查询秩序册\n");
        printf("             3. 查询项目结果榜单\n");   //输入all展示所有（支持排序） 输入某项目名称展示该项目（支持排序）
        printf("             4. 修改密码\n");
        printf("             5. 退出\n");
        printf("\n");
        printf("============================================\n");
        printf("请输入您的选择 (1-5): ");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            QueryAth(LA,Ath);
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 2:
            QueryGameSchedule(LA);    
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 3:
            QueryScoreByEvent(LA,Ath); 
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 4:
            ChangePassword(LU,Ath);   
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 5:
            printf("按enter键继续\n");
            getchar();
            getchar();
            return;
        default:
            printf("无效选项，请重新输入！\n");
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        }
    }
}

//学院端
void MenuCollege(ListAth* LA, ListUser* LU, ListCollege* LC, ListEvent* LE, User* currentUser)
{
    const int role = Col;
    int choice = 0;
    while (1)
    {
        clearScreen();
        printf("============================================\n");
        printf("         %20s\n",LC->Data[GetCollegeByID(LC,currentUser->Id)].name);
        printf("============================================\n");
        printf("\n");
        printf("             1. 增加学生报名信息\n");
        printf("             2. 删除学生报名信息\n");           
        printf("             3. 查询秩序册\n");
        printf("             4. 查询学生信息\n");                  //(通过筛改实现)输入all展示所有（支持排序） 输入项目查询本院项目所有人（支持排序） 输入学号查询某一人
        printf("             5. 查询学院比赛得分排名\n");
        printf("             6. 查询项目结果榜单\n");               //输入all展示所有（支持排序） 输入某项目名称展示该项目（支持排序）
        printf("             7. 退出\n");            //
        printf("\n");
        printf("============================================\n");
        printf("请输入您的选择 (1-7): ");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            AddByID(LA,LU,LC,LE,currentUser);      
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 2:
            DelById(LA, LC, LU, currentUser);
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 3:
            QueryGameSchedule(LA);  
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 4:
            QueryAth(LA,Col);   
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 5:
            QueryCollegeScore(LC,Col);   
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 6:
            QueryScoreByEvent(LA,Col);
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 7:
            printf("按enter键继续\n");
            getchar();
            getchar();
            return;
        default:
            printf("无效选项，请重新输入！\n");
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        }
    }
}
//该全局变量用于判断秩序册是否生成
int k = 0;

//管理员端
void MenuAdmin(ListAth* LA, ListUser* LU, ListCollege* LC, ListEvent* LE, User* currentUser)
{
    const int role = Adm;
    int choice = 0;
    while (1)
    {
        clearScreen();
        printf("============================================\n");
        printf("                管理员端\n");
        printf("============================================\n");
        printf("\n");
        printf("             1. 增加学生报名信息\n");
        printf("             2. 增加比赛项目\n");
        printf("             3. 删除学生报名信息\n");
        printf("             4. 删除项目\n");
        printf("             5. 查询学生信息\n");               //输入all展示所有（支持排序） 输入学院查整个学院 输入项目查所有项目报名的人 输入学号查某人
        printf("             6. 查询学院排名及得分\n");
        printf("             7. 查询查询项目结果榜单\n");       //输入all展示所有（支持排序） 输入某项目名称展示该项目（支持排序）
        printf("             8. 查询秩序册\n");            //
        printf("             9. 生成秩序册\n");
        printf("             10.退出\n");                  //
        printf("\n");
        printf("============================================\n");
        printf("请输入您的选择 (1-10): ");
        scanf("%d", &choice);
        switch (choice)
        {
        case 1:
            AddByID(LA,LU,LC,LE,currentUser);
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 2:
            AddEvent(LE,Adm); 
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;                         
        case 3:
            DelById(LA,LC,LU,currentUser);   
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 4:
            DelEvent(LA,LE,LC,LU,currentUser);   
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 5:
            QueryAth(LA,Adm);
            printf("按enter键继续\n");
            getchar();
            getchar();
        case 6:
            QueryCollegeScore(LC,Adm);
            printf("按enter键继续\n");
            getchar();
            getchar();
        case 7:
            QueryScoreByEvent(LA,Adm);
            printf("按enter键继续\n");
            getchar();
            getchar();
        case 8:
            QueryGameSchedule(LA);
            printf("按enter键继续\n");
            getchar();
            getchar();
        case 9:
            GenerateSchedule(LA);
            k = 1;
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        case 10:
            printf("感谢使用运动会管理系统！\n");
            printf("按enter键继续\n");
            getchar();
            getchar();
            return;
        default:
            printf("无效选项，请重新输入！\n");
            printf("按enter键继续\n");
            getchar();
            getchar();
            break;
        }
    }
}

// 主菜单  登入界面
void MainMenu(ListAth* LA, ListUser* LU, ListCollege* LC, ListEvent* LE) {
    int role = 0;
    User currentUser; // 存储当前成功登录的用户信息      （将临时变量放在主菜单而不是中，可以支持反复多次登入，每一次从主菜单中出去，都刷新这个变量）

    while (1) {
        clearScreen();
        printf("============================================\n");
        printf("             运动会管理系统\n");
        printf("============================================\n");
        printf("\n");
        printf("             1. 运动员登录\n");
        printf("             2. 学院登录\n");
        printf("             3. 管理员登录\n");
        printf("             0. 退出系统\n");
        printf("\n");
        printf("============================================\n");
        printf("请输入您的选择 (0-3): ");
        scanf("%d", &role);


        //将登入信息存储在currentUser中
        switch (role) {
        case Ath:  
            if (login(LU, &currentUser, Ath)) 
            {
                printf("正在进入运动员系统...\n");
                Sleep(1000);
                MenuAthlete(LA,LU, &currentUser);  // 进入运动员菜单
            }
            break;

        case Col:  
            if (login(LU, &currentUser, Col)) {
                printf("正在进入学院系统...\n");
                Sleep(1000);
                MenuCollege(LA,LU,LC,LE,&currentUser);  // 进入学院菜单
            }
            break;

        case Adm:  
            if (login(LU, &currentUser, Adm)) {
                printf("正在进入管理员系统...\n");
                Sleep(1000);
                MenuAdmin(LA, LU, LC, LE, &currentUser);    // 进入管理员菜单
            }
            break;

        case Exit: // 0
            printf("感谢使用运动会管理系统！\n");
            Sleep(2000);
            exit(0);

        default:
            printf("无效选项，请重新输入！\n");
            Sleep(1000);
        }
    }
}

// 主函数
int main() {

    //初始化表格
    ListAth LA;
    ListCollege LC;
    ListEvent LE;
    ListUser LU;
    InitListAth(&LA);
    InitListCollege(&LC);
    InitListEvent(&LE);
    InitListUser(&LU);
  

    readCSV("L_withoutSocre.csv", &LA,&LE,&LU);
    SortListAthByID(&LA);//对读取的数据排序

    //调试信息，查看所有运动员信息 查看所有运动员信息
    //PrintListAth(&LA);
    //PrintListUser(&LU);


    MainMenu(&LA,&LU,&LC,&LE);
    return 0;
}